#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#include "Profil.h"


void initProfil (Profil* pprofil, char* pseudo, int i_pniveau_actuel, const int i_pniveau_suivant,
		 const int score, const int difficult)
{
	assert (pprofil!=NULL);
	strcpy(pprofil->pseudo_joueur, pseudo);
	pprofil->i_pniveau_actuel_joueur = i_pniveau_actuel;
	pprofil->i_pniveau_suivant_joueur = i_pniveau_suivant;
	pprofil->score_joueur = score;
	pprofil->difficulte = difficult;
}

Profil* creerProfil (char* pseudo, int i_pniveau_actuel ,const int i_pniveau_suivant, 
		     const int score, const int difficult)
{
	 Profil* pprofil=malloc(sizeof(Profil));
	 initProfil(pprofil, pseudo, i_pniveau_actuel, i_pniveau_suivant, score, difficult);
	 return pprofil;
}

void detruireProfil (Profil** ppprofil)
{
	 assert (ppprofil!=NULL);
	 free(*ppprofil);
	 *ppprofil=NULL;
}

char* getPseudoProfil (const Profil* pprofil)
{
	  assert (pprofil!=NULL);
	  return pprofil->pseudo_joueur;
}

void setPseudoProfil (Profil* pprofil, char* pseudo)
{
	  assert (pprofil!=NULL);
	  pprofil->pseudo_joueur = pseudo;
}

const int getNiveauActuelProfil (const Profil* pprofil)
{
	  assert (pprofil!=NULL);
	  return pprofil->i_pniveau_actuel_joueur;
  
  
}

void setNiveauActuelProfil (Profil* pprofil, int i_pniveau_actuel)
{
	  assert (pprofil!=NULL);
	  assert (i_pniveau_actuel >= 0);
	  pprofil->i_pniveau_actuel_joueur = i_pniveau_actuel;
  
}

const int getNiveauSuivantProfil (const Profil* pprofil)
{
	  assert (pprofil!=NULL);
	  return pprofil->i_pniveau_suivant_joueur;
  
  
}

void setNiveauSuivantProfil (Profil* pprofil, int i_pniveau_suivant)
{
	  assert (pprofil!=NULL);
	  assert (i_pniveau_suivant >= 0);
	  pprofil->i_pniveau_suivant_joueur = i_pniveau_suivant;
  
}

const int getScoreProfil (const Profil* pprofil)
{
	  assert (pprofil!=NULL);
	  return pprofil->score_joueur;
  
}


void setScoreProfil (Profil* pprofil, const int score)
{
	  assert (pprofil != NULL  && score >=0);
	  pprofil->score_joueur = score;
  
}

const int getDifficulteProfil (const Profil* pprofil)
{
	  assert (pprofil != NULL);
	  return pprofil->difficulte;
  
}


void setDifficulteProfil (Profil* pprofil, const int difficult)
{
	  assert (pprofil != NULL);
	  assert(difficult == 0 || difficult == 1 || difficult == 2 || difficult == 3);
	  pprofil->difficulte = difficult;
  
}

void transfererDonneesProfil(Profil* pprofil, char* pseudo, const int num_niveau_actuel, const int num_niveau_suivant,
			     const int score_niveau, const int difficult)
{
	  assert (pprofil != NULL);
	  assert (score_niveau >= 0);
	  assert (num_niveau_actuel >= 0);
	  assert (num_niveau_suivant >= 0);
	  setPseudoProfil(pprofil, pseudo);
	  setNiveauActuelProfil(pprofil, getNiveauActuelProfil(pprofil) + num_niveau_actuel);
	  setNiveauSuivantProfil(pprofil, getNiveauSuivantProfil(pprofil) + num_niveau_suivant);
	  setScoreProfil(pprofil, getScoreProfil(pprofil) + score_niveau);
	  setDifficulteProfil(pprofil, difficult);
}
	  


Profil* chargerProfil (const char* nom)
{
	  FILE* fichier = NULL;
	  Profil* pprofil;
	  int pniveau_actuel = 0;
	  int pniveau_suivant = 0;
	  int score = 0;
	  int difficult = 0;
	  char pseudo[50];
	  
	  fichier = fopen(nom, "r");
  
	  if (fichier != NULL)
	  {
		fscanf(fichier, "%s\n%d\n%d\n%d\n%d", &pseudo, &pniveau_actuel, &pniveau_suivant, &score, &difficult);
		pprofil = creerProfil(pseudo, pniveau_actuel, pniveau_suivant, score, difficult);
		fclose(fichier);
	  }
	  else
		  pprofil = creerProfil("default", 0, 1, 0, 0);
	  return pprofil;
}



void sauvegarderProfil (const Profil* pprofil)
{
	  assert (pprofil != NULL);
	  FILE* fichier = NULL;
	  char nom_fichier[50];
	  strcpy(nom_fichier, getPseudoProfil(pprofil));
	  
	  fichier = fopen(nom_fichier, "w+");
  
	  if (fichier != NULL)
	  {
		fprintf(fichier,"\n%s\n%d\n%d\n%d\n%d", getPseudoProfil(pprofil), getNiveauActuelProfil(pprofil), 
							getNiveauSuivantProfil(pprofil), getScoreProfil(pprofil), 
							getDifficulteProfil(pprofil)); 
		fclose(fichier);
	  }
}


void sauvegarderNom (char* nom) // Contiendra le nom associé au profil actif.
{
	  FILE* fichier = NULL;
	  
	  fichier = fopen("nom", "w+");
  
	  if (fichier != NULL)
	  {
		fprintf(fichier,"\n%s", nom); 
		fclose(fichier);
	  }
}

void chargerNom (char* nom2)
{
	  FILE* fichier = NULL;
	  fichier = fopen("nom", "r");
	  char nom[50];
  
	  if (fichier != NULL)
	  {
		fscanf(fichier, "%s", &nom);
		fclose(fichier);
	  }
	  strcpy(nom2, nom);
	  
}


/** @brief Cette procédure permet de tester toutes les fonctions du module*/
void testRegressionProfil ()
{
  
	Profil* pprofil;
	char pseudo[] = "Pierre";
	char nom[50];
	
	int i_pniveau_actuel = 0;
	int i_pniveau_suivant = 1;
	int score = 22;
	int difficult = 1;
	
  
	pprofil = creerProfil(pseudo, i_pniveau_actuel, i_pniveau_suivant, score, difficult);
	printf("apres initialisation les valeurs du profil devraient etre 0, 1, 22 et 1 elles sont %d, %d, %d et %d \
et les get donnent %d, %d, %d et %d\n\n",
		pprofil->i_pniveau_actuel_joueur, pprofil->i_pniveau_suivant_joueur, pprofil->score_joueur, pprofil->difficulte,
		getNiveauActuelProfil(pprofil), getNiveauSuivantProfil(pprofil),getScoreProfil(pprofil),
	        getDifficulteProfil(pprofil));
	printf("le pseudo est %s et la valeur du get est %s\n\n", pprofil->pseudo_joueur, getPseudoProfil(pprofil));
	sauvegarderProfil(pprofil);
	
	setScoreProfil(pprofil,25);
	setDifficulteProfil(pprofil, 2);
	setNiveauActuelProfil(pprofil, 4);
	setPseudoProfil(pprofil, "Arthur");
	printf(" les valeurs devraient etre 4,25 et 2 elles sont %d, %d et %d et les get donnent %d,%d et %d\n\n",
		pprofil->i_pniveau_actuel_joueur, pprofil->score_joueur, pprofil->difficulte,
		getNiveauActuelProfil(pprofil), getScoreProfil(pprofil), getDifficulteProfil(pprofil));
	sauvegarderProfil(pprofil);
	
	detruireProfil(&(pprofil));
	pprofil = chargerProfil("Pierre");
	setPseudoProfil(pprofil, "Arnold");
	sauvegarderProfil(pprofil);

	printf("les valeurs du profil devraient etre Arnold ,0 et 22 elles sont  %s %d et %d et les get donnent %s, %d et %d\n\n",
		pprofil->pseudo_joueur, pprofil->i_pniveau_actuel_joueur, pprofil->score_joueur,
		getPseudoProfil(pprofil), getNiveauActuelProfil(pprofil), getScoreProfil(pprofil));
	
	transfererDonneesProfil(pprofil, "benou", 1, 1, 2000, 1);
	printf("les valeurs du profil devraient etre 1 et 2022 elles sont %d et %d et le get donne %d et %d\n\n",
		pprofil->i_pniveau_actuel_joueur, pprofil->score_joueur, getNiveauActuelProfil(pprofil), getScoreProfil(pprofil));
	sauvegarderProfil(pprofil);
	
	sauvegarderNom(pseudo);
	chargerNom(nom);
	printf("la chaine est %s\n",nom);
	sauvegarderNom("Octave");
	chargerNom(nom);
	printf("la chaine est %s\n",nom);
	
	pprofil=creerProfil(nom, i_pniveau_actuel,i_pniveau_suivant, score, difficult);
	transfererDonneesProfil(pprofil, nom, 1, 1, 20000, 0);
	sauvegarderProfil(pprofil);
	
	printf("Test regression profil termine\n\n");
}
